package main

import (
	"database/sql"
	"fmt"
	"github.com/gin-gonic/gin"
	// 导入依赖前边添加一个下划线，表示只执行里面init方法，不会导入里面的变量或其他方法
	_ "github.com/go-sql-driver/mysql"
	"log"
)

// 注意，这里的属性定义是大写开头的，我以小写开头，在进行json返回数据的时候，没有正确的填充值
// 结构体名称首字母小写，则包外部不能使用。大写则包外部能使用。
// 字段名称首字母大写，包外部才能访问，首字母小写包外部不能访问。
type Device struct {
	Id   string `json:"id"`
	Name string `json:"name"`
}

// main方法，必须在package main包内
func main() {

	// 创建一个服务
	ginServer := gin.Default()

	db, err := sql.Open("mysql", "root:123456@tcp(127.0.0.1:3306)/livegbs?charset=utf8mb4&parseTime=True&loc=Local")
	if err != nil {
		log.Fatal(err)
	}
	// defer 关键字用于推迟某个函数的执行，直到包含该defer语句的
	// 函数执行完毕之后，defer后的函数才会被调用。
	defer db.Close()

	// 确保数据库连接成功
	if err := db.Ping(); err != nil {
		log.Fatal(err)
	}

	// 从数据库中查询一条记录示例
	ginServer.GET("/queryDBone", func(context *gin.Context) {
		var id string
		var name string
		err := db.QueryRow("select id, `name` from t_devices where id = ?", "13010100002000000115").Scan(&id, &name)
		if err != nil {
			log.Fatal(err)
		}
		// 返回查询结果
		context.JSON(200, gin.H{
			"id":   id,
			"name": name,
		})
	})

	// 从数据库中查询多条数据示例
	ginServer.GET("/queryDBmany", func(context *gin.Context) {
		stmt, err := db.Prepare("select id, `name` from t_devices where id > '' and `name` > '' limit 10")
		if err != nil {
			log.Fatalf("准备查询语句失败: %v", err)
		}
		defer stmt.Close()

		// 执行查询
		rows, err := stmt.Query()
		if err != nil {
			log.Fatalf("执行查询失败: %v", err)
		}
		defer rows.Close()

		// 便利查询结果
		var deviceList []Device
		for rows.Next() {
			var device Device
			if err := rows.Scan(&device.Id, &device.Name); err != nil {
				log.Printf("扫描行数据失败: %v", err)
				continue
			}
			deviceList = append(deviceList, device)
		}

		if err := rows.Err(); err != nil {
			log.Printf("遍历结果集时发生错误: %v", err)
		}

		// 打印结果
		for _, device := range deviceList {
			fmt.Printf("id: %s, name: %s\n", device.Id, device.Name)
		}

		log.Println(deviceList)

		// 返回查询结果
		context.JSON(200, gin.H{
			"code": 0,
			"data": deviceList,
		})
	})

	// 服务端口
	ginServer.Run(":8082")

}
